#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
推送代码到指定的Gitee仓库
使用用户提供的仓库信息：https://gitee.com/yulai_fenglinjing/Vulnerable.git
"""

import os
import sys
import subprocess
import time

# 设置编码为UTF-8
os.environ['PYTHONIOENCODING'] = 'utf-8'

# 预配置的Gitee仓库信息
GITEE_REPO_URL = 'https://gitee.com/yulai_fenglinjing/Vulnerable.git'
GITEE_USERNAME = 'yulai_fenglinjing'


def run_command(command, cwd=None):
    """执行命令并返回结果"""
    try:
        result = subprocess.run(
            command,
            shell=True,
            cwd=cwd,
            capture_output=True,
            text=True,
            encoding='utf-8',
            errors='replace'
        )
        return {
            'success': result.returncode == 0,
            'output': result.stdout,
            'error': result.stderr,
            'returncode': result.returncode
        }
    except Exception as e:
        return {
            'success': False,
            'output': '',
            'error': f"执行命令时出错: {str(e)}",
            'returncode': 1
        }


def print_info(message):
    """打印信息"""
    print(f"[INFO] {message}")


def print_error(message):
    """打印错误"""
    print(f"[ERROR] {message}")


def print_success(message):
    """打印成功信息"""
    print(f"[SUCCESS] {message}")


def check_git_installed():
    """检查Git是否已安装"""
    print_info("检查Git是否已安装...")
    result = run_command("git --version")
    if not result['success']:
        print_error("Git未安装，请先安装Git")
        print_error(result['error'])
        return False
    print_success(f"Git已安装: {result['output'].strip()}")
    return True


def check_if_git_repo():
    """检查当前目录是否已经是Git仓库"""
    print_info("检查当前目录是否已是Git仓库...")
    if not os.path.exists('.git'):
        print_info("当前目录不是Git仓库，正在初始化...")
        result = run_command("git init")
        if not result['success']:
            print_error("初始化Git仓库失败")
            print_error(result['error'])
            return False
        print_success("Git仓库初始化成功")
        return True
    print_success("当前目录已是Git仓库")
    return True


def configure_git_user():
    """配置Git用户名和邮箱"""
    print_info("配置Git用户信息...")
    
    # 配置用户名
    username_cmd = "git config user.name " + GITEE_USERNAME
    result = run_command(username_cmd)
    if not result['success']:
        print_error("配置用户名失败")
        print_error(result['error'])
        return False
    
    # 使用默认邮箱
    email = f"{GITEE_USERNAME}@example.com"
    email_cmd = "git config user.email " + email
    result = run_command(email_cmd)
    if not result['success']:
        print_error("配置邮箱失败")
        print_error(result['error'])
        return False
    
    print_success(f"Git用户配置成功: {GITEE_USERNAME} <{email}>")
    return True


def check_and_add_remote():
    """检查是否已添加远程仓库，如果没有则添加"""
    print_info("检查远程仓库配置...")
    result = run_command("git remote -v")
    
    # 检查是否已有同名远程仓库
    if "origin" in result['output']:
        print_info("已存在origin远程仓库，检查是否匹配...")
        if GITEE_REPO_URL in result['output']:
            print_success("远程仓库配置正确")
            return True
        else:
            print_info("远程仓库地址不匹配，正在更新...")
            result = run_command(f"git remote set-url origin {GITEE_REPO_URL}")
            if not result['success']:
                print_error("更新远程仓库失败")
                print_error(result['error'])
                return False
            print_success("远程仓库更新成功")
            return True
    else:
        print_info("添加远程仓库...")
        result = run_command(f"git remote add origin {GITEE_REPO_URL}")
        if not result['success']:
            print_error("添加远程仓库失败")
            print_error(result['error'])
            return False
        print_success(f"远程仓库添加成功: {GITEE_REPO_URL}")
        return True


def add_and_commit_files():
    """添加文件并提交"""
    print_info("添加所有文件到暂存区...")
    
    # 先检查.gitignore文件
    if not os.path.exists('.gitignore'):
        print_error(".gitignore文件不存在，请先创建.gitignore文件")
        return False
    
    # 添加所有文件
    result = run_command("git add .")
    if not result['success']:
        print_error("添加文件失败")
        print_error(result['error'])
        return False
    
    # 检查是否有更改需要提交
    result = run_command("git status --porcelain")
    if not result['output'].strip():
        print_info("没有文件需要提交，所有文件都已是最新状态")
        return True
    
    # 提交文件
    commit_message = f"更新项目文件 - {time.strftime('%Y-%m-%d %H:%M:%S')}"
    commit_cmd = "git commit -m " + '"' + commit_message + '"'
    result = run_command(commit_cmd)
    if not result['success']:
        print_error("提交文件失败")
        print_error(result['error'])
        return False
    
    print_success(f"文件提交成功: {commit_message}")
    return True


def push_to_gitee():
    """推送到Gitee仓库"""
    print_info(f"推送到Gitee仓库: {GITEE_REPO_URL}")
    
    # 由于这是首次推送，我们使用 -u 参数设置上游分支
    result = run_command("git push -u origin master")
    
    # 如果推送失败，可能是因为分支名称不同或需要先拉取
    if not result['success']:
        # 尝试使用 main 分支名称
        print_info("尝试使用 main 分支推送...")
        result = run_command("git push -u origin main")
        
        if not result['success']:
            # 尝试先拉取并合并
            print_info("尝试先拉取远程仓库内容...")
            pull_result = run_command("git pull --rebase origin master")
            if not pull_result['success']:
                print_info("尝试拉取main分支...")
                pull_result = run_command("git pull --rebase origin main")
            
            # 再次尝试推送
            print_info("再次尝试推送...")
            result = run_command("git push origin master")
            if not result['success']:
                result = run_command("git push origin main")
    
    if result['success']:
        print_success("代码成功推送到Gitee仓库！")
        return True
    else:
        print_error("推送失败")
        print_error(result['error'])
        print_info("提示：请确保您有访问该仓库的权限，或者先在Gitee上创建该仓库")
        print_info(f"仓库地址: {GITEE_REPO_URL}")
        return False


def check_frontend_port():
    """检查前端Vue项目的配置端口"""
    print_info("检查前端Vue项目配置...")
    frontend_dir = os.path.join(os.getcwd(), 'frontend')
    vite_config = os.path.join(frontend_dir, 'vite.config.js')
    
    if os.path.exists(vite_config):
        try:
            with open(vite_config, 'r', encoding='utf-8') as f:
                config_content = f.read()
                if 'port: 3000' in config_content:
                    print_success("Vue前端项目配置的端口是3000，不是8080")
                    return 3000
                else:
                    print_info("未找到明确的端口配置，默认可能是3000")
                    return 3000
        except Exception as e:
            print_error(f"读取前端配置文件出错: {str(e)}")
    else:
        print_error("未找到前端配置文件")
    return None


def main():
    """主函数"""
    print("=" * 60)
    print("推送代码到Gitee仓库脚本")
    print(f"目标仓库: {GITEE_REPO_URL}")
    print("=" * 60)
    
    # 检查前端端口
    frontend_port = check_frontend_port()
    if frontend_port:
        print(f"提示：Vue前端项目使用端口 {frontend_port}，而不是8080")
    
    # 检查Git安装
    if not check_git_installed():
        return 1
    
    # 检查/初始化Git仓库
    if not check_if_git_repo():
        return 1
    
    # 配置Git用户
    if not configure_git_user():
        return 1
    
    # 添加/检查远程仓库
    if not check_and_add_remote():
        return 1
    
    # 添加并提交文件
    if not add_and_commit_files():
        return 1
    
    # 推送到Gitee
    if not push_to_gitee():
        return 1
    
    print("=" * 60)
    print_success("代码推送完成！")
    print(f"仓库地址: {GITEE_REPO_URL}")
    print(f"前端端口: {frontend_port or '未知'}")
    print("=" * 60)
    
    # 提示启动前端
    if frontend_port:
        print("\n要启动前端项目，请在frontend目录下运行:")
        print("npm install")
        print("npm run dev")
        print(f"然后访问 http://localhost:{frontend_port}")
    
    return 0


if __name__ == "__main__":
    sys.exit(main())